package com.geostar.constructionland.attachment.controller;

import com.geostar.constructionland.attachment.config.StaticValue;
import com.geostar.constructionland.attachment.entity.FileDownVo;
import com.geostar.constructionland.attachment.entity.PortalInterfaceResult;
import com.geostar.constructionland.attachment.entity.Result;
import com.geostar.constructionland.attachment.entity.TextExtractor;
import com.geostar.constructionland.attachment.service.IPreviewService;
import com.geostar.constructionland.attachment.service.IStorageService;
import com.geostar.constructionland.attachment.service.MongoGridFsService;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.net.URLEncoder;
import java.nio.charset.StandardCharsets;
import java.util.HashMap;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.validation.constraints.NotEmpty;

import com.geostar.constructionland.attachment.service.StorageServiceFactory;
import com.geostar.constructionland.attachment.util.*;
import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.FileUtils;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;


import com.google.common.io.Files;

@Controller
@RequestMapping("/fileView")
@Slf4j
public class FileViewController {

//  //是否启用金格进行预览
//  @Value("${enable_weboffice}")
//  private String enableWeboffice;

//  @Autowired
//  @RequestMapping(value = "/fileView")
//  public String toFileView(HttpSession session, HttpServletRequest request, HttpServletResponse response) {
//    String fileId = request.getParameter("id");
//    //如果启用了金格
//    if ("1".equals(enableWeboffice)) {
//      //Word和Excel文件预览特殊处理使用金格weboffice
//      GridFSDBFile gridFSDBFile = mongoGridFsService.downLoadFileByFileId(fileId);
//      if (gridFSDBFile != null) {
//        String originalName = (String) gridFSDBFile.getFilename();
//        String fileExt = FilenameUtils.getExtension(originalName);
//        //判断是Word或Excel文件
//        if (TextExtractor.isWordFile(originalName) || TextExtractor.isExcelFile(originalName)) {
//          //获取金格预览专用文件夹路径
//          String basePath = (String) session.getServletContext().getAttribute(StaticValue.PATH_KEY_FOR_PREVIEW_WEBOFFICE);
//          String localFilename = fileId + "." + fileExt;
//          //为了预览生成本地文件
//          File localFile = new File(basePath, localFilename);
//          try {
//            Files.createParentDirs(localFile);
//            gridFSDBFile.writeTo(localFile);
//          } catch (IOException e) {
//            e.printStackTrace();
//          }
//          request.setAttribute("fileType", "." + fileExt);
//          request.setAttribute("localFilename", localFilename);
//          return "iWebOffice2009/docEdit";
//        }
//      }
//    }
//    request.setAttribute("id", fileId);
//    //showOcr用来判断预览时显示预览文件还是Ocr内容
//    //0正常显示预览 1显示Ocr内容
//    //调用预览接口没有传showOcr则赋值showOcr为-1
//    String showOcr = request.getParameter("showOcr");
//    if (showOcr == null) {
//      showOcr = "-1";
//    }
//    request.setAttribute("showOcr", showOcr);
//    return "view/localView";
//  }

  @Autowired
  IPreviewService previewService;
  /**
   * 文件预览 包括远程文件 <br>
   * <功能详细描述>
   *
   * @param response [参数说明]
   * @return void [返回类型说明]
   * @throws throws [违例类型] [违例说明]
   * @see [类、类#方法、类#成员]
   */
  @RequestMapping(value = "/fileContent")
  public void fileContent(@NotEmpty(message = "附件ID不能为空") String id, HttpSession session, HttpServletRequest request, HttpServletResponse response) {
//    FileDownVo fileDownVo = previewService.getPreFile(id);
//    try {
//      String originalName = fileDownVo.getFileName();
//      //判断文件是否支持预览
//      if (TextExtractor.isPreviewSupportedFile(originalName)) {
//        log.info("开始预览文件: " + originalName + " (" + id + ")");
//        String previewName = URLEncoder.encode(originalName, "UTF-8").
//            replaceAll("\\+", "%20").
//            replaceAll("%28", "\\(").
//            replaceAll("%29", "\\)").
//            replaceAll("%3B", ";").
//            replaceAll("%40", "@").
//            replaceAll("%23", "\\#").
//            replaceAll("%26", "\\&").
//            replaceAll("%2C", "\\,").
//            replaceAll("%5B", "\\[").
//            replaceAll("%5D", "\\]");
//        response.setHeader("Content-Disposition", "inline;filename=" + previewName);
//                if (StringUtils.isNotBlank(indentifyId)) {
//                    basePath = basePath + File.separator +indentifyId;
//                }
        //pdf中间文件
//        pdfFile = new File(basePath + File.separator + md5 + ".pdf");
//        pdfFiletxt = new File(basePath + File.separator + md5 + ".pdf.txt");
//        /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//        /*如果预览所生成pdf中间文件已经存在 说明之前预览过 直接读取pdf中间文件写入response*/
//        /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//        if (pdfFile.exists() && pdfFile.length() == 0) {
//          FileUtils.deleteQuietly(pdfFile);
//        }
//        if (pdfFile.canRead() && pdfFile.length() > 0) {
//          log.info("发现pdf中间文件: " + pdfFile.getAbsolutePath() + " 直接写入服务器响应");
//          mimeType = "text/plain";
//          response.setContentType(mimeType);
//          String pdfPath = "../.." + StaticValue.PATH_VALUE_FOR_PREVIEW + "/" + pdfFile.getName();
//          HashMap<String, String> map = new HashMap<String, String>();
//          map.put("fileType", "PDF");
//          map.put("filePath", pdfPath);
//          result.setData(map);
//          Files.write(result.toJsonStr(), pdfFiletxt, StandardCharsets.UTF_8);
//          os = response.getOutputStream();
//          Files.copy(pdfFiletxt, os);
//        }
//        /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//        /*如果预览所生成pdf中间文件已经存在 说明之前预览过 直接读取pdf中间文件写入response*/
//        /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//
//        /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//        /*如果预览所生成pdf中间文件不存在 说明需要先将Mongo中的文件保存到本地 再做处理*/
//        /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//        else {
//          localFile = new File(basePath + File.separator + md5 + "." + extension);
//          Files.createParentDirs(localFile);
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          /*判断是Mongo文件 将Mongo文件保存到本地*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          if (StringUtils.isBlank(sourceId)) {
//            log.info("开始下载Mongo文件:" + originalName + "(" + id + ")");
//            FileOutputStream fileOutputStream = new FileOutputStream(localFile);
//            fileOutputStream.write(targetBytes);
//            fileOutputStream.flush();
//            fileOutputStream.close();
////            gridFSDBFile.writeTo(loacalFile);
//            /**打开文件流 写入 bytes**/
//            log.info("完成下载Mongo文件:" + originalName + "(" + id + ")");
//          }
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*判断是Mongo文件 将Mongo文件保存到本地*/
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          /*判断是远程文件 将远程文件保存到本地*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          else {
//            log.info("开始下载远程文件:" + originalName + "(" + id + ")");
//            String objectPath = (String) gridFSDBFile.get("path"); //数据库中的保存路径
//            DataSource dataSource = dataSourceService.findOne(sourceId);
//            DataSourceProcessor processor = ProcessorUtils.retrieveDataSourceProcessor(dataSource);
//            os2 = new FileOutputStream(localFile);
//            processor.writeObjectToOutputStream(dataSource, objectPath, originalName, os2);
//            log.info("完成下载远程文件:" + originalName + "(" + id + ")");
//          }
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*判断是Mongo文件 将Mongo文件保存到本地*/
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          /*如果本身就是pdf文件，则直接读取pdf写入response*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          if (TextExtractor.isPdfFile(originalName)) {
//            String pdfPath = "../.." + StaticValue.PATH_VALUE_FOR_PREVIEW + "/" + localFile.getName();
//            HashMap<String, String> map = new HashMap<String, String>();
//            map.put("fileType", "PDF");
//            map.put("filePath", pdfPath);
//            result.setData(map);
//            Files.write(result.toJsonStr(), pdfFiletxt, StandardCharsets.UTF_8);
//            os = response.getOutputStream();
//            Files.copy(pdfFiletxt, os);
//          }
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*如果本身就是pdf文件，则直接读取pdf写入response*/
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          /*如果是office文件，则转化成pdf，在读取pdf写入response*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          else if (TextExtractor.isOfficeFile(originalName)) {
//            FileTypeConverter converter = new FileTypeConverter();
//            converter.office2pdf2(localFile, pdfFile);
//            String pdfPath = "../.." + StaticValue.PATH_VALUE_FOR_PREVIEW + "/" + pdfFile.getName();
//            HashMap<String, String> map = new HashMap<String, String>();
//            map.put("fileType", "PDF");
//            map.put("filePath", pdfPath);
//            result.setData(map);
//            Files.write(result.toJsonStr(), pdfFiletxt, StandardCharsets.UTF_8);
//            os = response.getOutputStream();
//            Files.copy(pdfFiletxt, os);
//          }
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*如果是office文件，则转化成pdf，在读取pdf写入response*/
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          /*如果是文本文件，则先探测编码格式及转码，再读取写入response*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          else if (TextExtractor.isTextFile(originalName)) {
//            mimeType = "text/plain";
//            response.setContentType(mimeType);
//            log.debug("response.setContentType(" + mimeType + ")");
//
//            String encoding = FileCharsetDetector.detect(localFile);
//            log.debug("guessFileEncoding: " + encoding);
//            os = response.getOutputStream();
//            if (!encoding.equals("UTF-8")) {
//              localFileUTF8 = new File(basePath + File.separator + md5 + "UTF-8." + extension);//之后清理
//              String text = FileUtils.readFileToString(localFile, encoding);
//              FileUtils.writeStringToFile(localFileUTF8, text, "UTF-8");
//              Files.copy(localFileUTF8, os);
//            } else {
//              Files.copy(localFile, os);
//            }
//          }
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*如果是文本文件，则先探测编码格式及转码，再读取写入response*/
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          /*剩下的图片格式，读取后写入response*/
//          /*>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>*/
//          else if (TextExtractor.isImageFile(originalName)) {
//            //通过测试发现mimeType设置成image/jpeg 除了tif/tiff以外其他都可以正常预览
//            mimeType = "image/jpeg";
//            response.setContentType(mimeType);
//            log.debug("response.setContentType(" + mimeType + ")");
//            os = response.getOutputStream();
//            Files.copy(localFile, os);
//          }
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//          /*剩下的图片格式，读取后写入response*/
//          /*<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<*/
//        }
//        log.info("完成预览文件: " + originalName + " (" + id + ")");
//      } else {//不支持预览 向页面写入一个提示图片
//        File not_support_preview_jpg = new File(appRoot + File.separator + "imgs" + File.separator + "not_support_preview.png");
//        os = response.getOutputStream();
//        Files.copy(not_support_preview_jpg, os);
//      }
//    } catch (Exception e) {
//      result.getResult().setCode(Result.ERROR);
//      if (StringUtils.isBlank(message)) {
//        message = "根据文件id: " + id + " 预览文件过程中发生异常";
//      }
//      result.getResult().setMessage(message);
//      log.error(message, e);
//    } finally {
//      IOUtils.closeQuietly(os);
//      IOUtils.closeQuietly(os2);
//      FileUtils.deleteQuietly(pdfFiletxt);
//      FileUtils.deleteQuietly(localFileUTF8);
//      if (!response.isCommitted()) {
//        ResponseUtils.renderJson(request, response, result.toJsonStr());
//      }
//    }
  }
}
